Material 组件库中提供了Material风格的单选开关 Switch 和复选框 Checkbox,虽然它们都是继承自 StatefulWidget,但它们本身不会保存当前选中状态,选中状态都是由父组件来管理的。当 SwitchCheckbox 被点击时,会触发它们的 onChanged 回调,我们可以在此回调中处理选中状态改变逻辑。下面看一个简单的例子:

class SwitchAndCheckBoxTestRoute extends StatefulWidget {
  SwitchAndCheckBoxTestRoute({Key key, this.title}) : super(key: key);
  final String title;

  @override
  _SwitchAndCheckBoxTestRouteState createState() =>
      new _SwitchAndCheckBoxTestRouteState();
}

class _SwitchAndCheckBoxTestRouteState extends State<SwitchAndCheckBoxTestRoute> {
  bool _switchSelected = true; //维护单选开关状态
  bool _checkboxSelected = true; //维护复选框状态
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Column(children: <Widget>[
        Switch(
          value: _switchSelected, //当前状态
          onChanged: (value) {
            //重新构建页面
            setState(() {
              _switchSelected = value;
            });
          },
        ),
        Checkbox(
          value: _checkboxSelected,
          activeColor: Colors.red, //选中时的颜色
          onChanged: (value) {
            setState(() {
              _checkboxSelected = value;
            });
          },
        ),
      ]),
    );
  }
}

上面代码中,由于需要维护 SwitchCheckbox 的选中状态,所以 SwitchAndCheckBoxTestRoute 继承自 StatefulWidget 。在其 build 方法中分别构建了一个 SwitchCheckbox,初始状态都为选中状态,当用户点击时,会将状态置反,然后回调用 setState() 通知 Flutter framework 重新构建 UI。

Flutter 还提供了一个 Checkbox 的封装类:CheckboxListTile,这个 Checkbox 可以设置标题,类似于这样:

代码是这样的:

CheckboxListTile(
    value: isCheck,
    title: new Text('是否打开'),
    controlAffinity: ListTileControlAffinity.platform,
    onChanged: (bool) {
        setState(() {
            isCheck = bool;
        });
    }),

看一下源码:

  const Switch({
    Key key,
    @required this.value,    //当前开关状态 布尔值
    @required this.onChanged,    //监听(开关状态改变时调用)
    this.activeColor,    //打开 状态 轨道 和 按钮颜色
    this.activeTrackColor,    //打开 状态轨道颜色
    this.inactiveThumbColor,    //关闭 状态按钮颜色
    this.inactiveTrackColor,    //关闭 状态轨道颜色
    this.activeThumbImage,    //打开 状态下按钮图片
    this.inactiveThumbImage,    //关闭 状态下按钮图片
    this.materialTapTargetSize,    //配置tap目标的最小大小
    this.dragStartBehavior = DragStartBehavior.start,    //确定处理拖动启动行为的方式。(没看出有什么变化)
  })
  const Checkbox({
    Key key,
    @required this.value,    // 是否选中
    this.tristate = false,    //默认false,但当为true时表示增加中间状态值,onchange的value:true 选中,null中间状态,false 不选中。
    @required this.onChanged,    //监听(开关状态改变时调用)
    this.activeColor,    //框的背景色,点击的效果色
    this.checkColor,    //中间的对勾颜色,中间状态的横杠颜色
    this.materialTapTargetSize,    //点击区域尺寸,padded:向四周扩展48px区域;shrinkWrap:控件区域
  })
  const CheckboxListTile({
    Key key,
    @required this.value,    // 是否选中
    @required this.onChanged,    //监听(开关状态改变时调用)
    this.activeColor,    //框的背景色,点击的效果色
    this.title,    //    标题
    this.subtitle,    //    子标题
    this.isThreeLine = false,    // 是否是三行文本
                                //true : 副标题 不能为 null
                                //false:如果没有副标题 ,就只有一行, 如果有副标题 ,就只有两行
    this.dense,    //是否密集垂直
    this.secondary,    //左边的一个控件
    this.selected = false,    //text 和 icon 的 color 是否 是 activeColor 的颜色
    this.controlAffinity = ListTileControlAffinity.platform,                    //ListTileControlAffinity.platform 根据不同的平台,来显示 对话框 的位置
//ListTileControlAffinity.trailing:勾选在右,title 在中,secondary 在左
//ListTileControlAffinity.leading :勾选在左,title 在中,secondary 在右
  })

results matching ""

    No results matching ""